var express = require('express');
var router = express.Router();
const {User} = require('../models')
const {Op} = require('sequelize')
const {success,failure} = require('../utils/response')
const {BadRequestError,UnauthorizedError,NotFoundError} = require('../utils/errors')
const bcrpt = require('bcryptjs')
const jwt = require('jsonwebtoken')

// 普通用户注册接口
router.post('/sign_up',async (req,res,next) => {
    try {
        const body = {
            email:req.body.email,
            username:req.body.username,
            nickname:req.body.nickname,
            password:req.body.password,
            company:req.body.company,
            sex:2,
            role:0,
        }
        const user = await User.create(body)
        // 删除sequelize返回的对象的passwo字段 这是sequelize里固定的用法
        delete user.dataValues.password
        success(res,'创建用户成功',{user},201)
    } catch (error) {
        failure(res,error)
    }
})



// 用户登录
router.post('/sign_in', async (req,res) => {
    try {
        const {login,password} = req.body
        if(!login){
            throw new BadRequestError('邮箱/用户名必须填写')
        }
        if(!password){
            throw new BadRequestError('密码必须填写')
        }
        const condition = {
            where:{
                [Op.or]:[
                    // 或查询
                    {email:login},
                    {username:login}
                ]
            }
        }
        const user = await User.findOne(condition)
        if(!user){
            throw new NotFoundError('用户不存在，无法登录')
        }
        // 使用bcrypt提供的方法判断密码是否正确,因为数据库中的密码是通过bcrypt加密过的
        // 第一个参数为要比对的密码，第二个为数据库中的密码
        const isPasswordValid = bcrpt.compareSync(password,user.password)
        if(!isPasswordValid){
            throw new UnauthorizedError('密码错误')
        }

        const token = jwt.sign({
            userId:user.id,//存放token的沟通信息
            //SECRET为密钥，可以为随机字符串，存放在根目录的.env环境变量文件中
        },process.env.SECRET,{expiresIn:'30d'})  //30d为token有效期30天

        success(res,'登录成功',{ token })
    } catch (error) {
        failure(res,error)
    }
})



module.exports = router